package com.dituhui.tool.io;

import java.util.Map;
import java.util.Set;

import org.apache.log4j.Logger;

import redis.clients.jedis.Jedis;

import com.dituhui.tool.util.StringUtil;

/**
 * Redis工具
 * 
 * @author liweigu
 * 
 */
public class RedisTool {
	/**
	 * 服务地址
	 */
	public static String HOST = Constants.getValue("REDIS.HOST");
	/**
	 * 服务端口
	 */
	public static int PORT = Integer.parseInt(Constants.getValue("REDIS.PORT"));
	/**
	 * 服务密码
	 */
	public static String PWD = Constants.getValue("REDIS.PWD");
	private static Logger LOGGER = Logger.getLogger(RedisTool.class);

	/**
	 * 同步获取Jedis实例 在多线程环境同步初始化
	 * 
	 * @return Jedis
	 */
	public static Jedis getJedis() {
		return getJedis(HOST, PORT, PWD);
	}

	/**
	 * 同步获取Jedis实例 在多线程环境同步初始化
	 * 
	 * @param host 服务地址
	 * @param port 服务端口
	 * @param password 服务密码
	 * 
	 * @return Jedis
	 */
	public static Jedis getJedis(String host, int port, String password) {
		Jedis jedis;
		jedis = new Jedis(host, port, 12000);
		if (password != null && password.length() > 0) {
			// System.out.println("password=" + password);
			jedis.auth(password);
		} else {
		}
		return jedis;
	}

	/**
	 * 释放jedis资源
	 * 
	 * @param jedis jedis
	 */
	public static void returnResource(Jedis jedis) {
		if (jedis != null) {
			jedis.close();
		}
	}

	/***
	 * redis 更新String类型的操作，在原来的字符串基础上append
	 * 
	 * @param dataMap 更新内容
	 */
	public void updateString(Map<String, String> dataMap) {
		updateString(dataMap, HOST, PORT, PWD);
	}

	/***
	 * redis 更新String类型的操作，在原来的字符串基础上append
	 * 
	 * @param dataMap 更新内容
	 * @param host 服务地址
	 * @param port 服务端口
	 * @param password 服务密码
	 */
	public void updateString(Map<String, String> dataMap, String host, int port, String password) {
		Jedis jedis = getJedis(host, port, password);
		if (jedis != null) {
			for (String key : dataMap.keySet()) {
				jedis.append(key, dataMap.get(key));
			}
			returnResource(jedis);
		} else {
			String message = "获取Jedis失败";
			LOGGER.warn(message);
		}
	}

	/***
	 * redis 读取String类型的值
	 * 
	 * @param key key
	 * @return 值
	 */
	public String getString(String key) {
		return getString(key, HOST, PORT, PWD);
	}

	/***
	 * redis 读取String类型的值
	 * 
	 * @param key key
	 * @param host 服务地址
	 * @return 值
	 */
	public String getString(String key, String host) {
		return getString(key, host, PORT, PWD);
	}

	/***
	 * redis 读取String类型的值
	 * 
	 * @param key key
	 * @param host 服务地址
	 * @param port 服务端口
	 * @param password 服务密码
	 * @return 值
	 */
	public String getString(String key, String host, int port, String password) {
		String value = "";

		Jedis jedis = getJedis(host, port, password);
		if (jedis != null) {
			value = jedis.get(key);
			returnResource(jedis);
		} else {
			String message = "获取Jedis失败";
			LOGGER.warn(message);
		}

		return value;
	}

	/***
	 * 新增
	 * 
	 * @param map
	 */
	public void createString(Map<String, String> map) {
		createString(map, HOST, PORT, PWD);
	}

	/***
	 * 新增
	 * 
	 * @param map 新增内容
	 * @param host 服务地址
	 * @param port 服务端口
	 * @param password 服务密码
	 */
	public void createString(Map<String, String> map, String host, int port, String password) {
		Jedis jedis = getJedis(host, port, password);
		if (jedis != null) {
			for (String key : map.keySet()) {
				jedis.set(key, map.get(key));
			}
			returnResource(jedis);
		} else {
			String message = "获取Jedis失败";
			LOGGER.warn(message);
		}
	}

	/***
	 * 删除
	 * 
	 * @param keyContent 搜索内容
	 * @return 0表示删除失败，大于0表示删除成功。
	 */
	public long delString(String keyContent) {
		return delString(keyContent, HOST, PORT, PWD);
	}

	/***
	 * 删除
	 * 
	 * @param keyContent 搜索内容
	 * @param host 服务地址
	 * @return 0表示删除失败，大于0表示删除成功。
	 */
	public long delString(String keyContent, String host) {
		return delString(keyContent, host, PORT, PWD);
	}

	/***
	 * 删除
	 * 
	 * @param keyContent 搜索内容
	 * @param host 服务地址
	 * @param port 服务端口
	 * @param password 服务密码
	 * @return 0表示删除失败，大于0表示删除成功。
	 */
	public long delString(String keyContent, String host, int port, String password) {
		long value = 0;

		Jedis jedis = getJedis(host, port, password);
		if (jedis != null) {
			value = jedis.del(keyContent);
			returnResource(jedis);
		} else {
			String message = "获取Jedis失败";
			LOGGER.warn(message);
		}

		return value;
	}

	/***
	 * redis 对key的模糊查询
	 * 
	 * @param keys 搜索内容
	 * @return key集合
	 */
	public Set<String> getKeys(String keys) {
		return getKeys(keys, HOST, PORT, PWD);
	}

	/***
	 * redis 对key的模糊查询
	 * 
	 * @param keys 搜索内容
	 * @param host 服务地址
	 * @return key集合
	 */
	public Set<String> getKeys(String keys, String host) {
		return getKeys(keys, host, PORT, PWD);
	}

	/***
	 * redis 对key的模糊查询
	 * 
	 * @param keyContent 搜索内容
	 * @param host 服务地址
	 * @param port 服务端口
	 * @param password 服务密码
	 * @return key集合
	 */
	public Set<String> getKeys(String keyContent, String host, int port, String password) {
		Set<String> value = null;

		Jedis jedis = getJedis(host, port, password);
		if (jedis != null) {
			value = jedis.keys(keyContent);
			returnResource(jedis);
		} else {
			String message = "获取Jedis失败";
			LOGGER.warn(message);
		}

		return value;
	}

	/***
	 * 追加值，在原来的字符串基础上追加,如果没有原来的，则创建一个新的
	 * 
	 * @param key key
	 * @param value 值
	 */
	public void appendString(String key, String value) {
		appendString(key, value, HOST, PORT, PWD);
	}

	/***
	 * 追加值，在原来的字符串基础上追加,如果没有原来的，则创建一个新的
	 * 
	 * @param key key
	 * @param value 值
	 * @param host 服务地址
	 */
	public void appendString(String key, String value, String host) {
		appendString(key, value, host, PORT, PWD);
	}

	/***
	 * 追加值，在原来的字符串基础上追加,如果没有原来的，则创建一个新的
	 * 
	 * @param key key
	 * @param value 值
	 * @param host 服务地址
	 * @param port 服务端口
	 * @param password 服务密码
	 */
	public void appendString(String key, String value, String host, int port, String password) {
		try {
			Jedis jedis = getJedis(host, port, password);
			if (jedis != null) {
				// if (jedis.exists(key)) {
				jedis.append(key, StringUtil.AngularBracket + value);
				// } else {
				// jedis.set(key, value);
				// }
				returnResource(jedis);
			} else {
				String message = "获取jedis失败";
				LOGGER.warn(message);
			}
		} catch (Exception e) {
			String message = "appendString发生异常。";
			LOGGER.warn(message, e);
		}
	}

	/***
	 * 设置值
	 * 
	 * @param key key
	 * @param value 值
	 */
	public void setString(String key, String value) {
		setString(key, value, HOST, PORT, PWD);
	}

	/***
	 * 设置值
	 * 
	 * @param key key
	 * @param value 值
	 * @param host 服务地址
	 */
	public void setString(String key, String value, String host) {
		setString(key, value, host, PORT, PWD);
	}

	/***
	 * 设置值
	 * 
	 * @param key key
	 * @param value 值
	 * @param host 服务地址
	 * @param port 服务端口
	 * @param password 服务密码
	 */
	public void setString(String key, String value, String host, int port, String password) {
		try {
			Jedis jedis = getJedis(host, port, password);
			if (jedis != null) {
				jedis.set(key, value);
				returnResource(jedis);
			} else {
				String message = "getJedis失败";
				LOGGER.warn(message);
			}
		} catch (Exception e) {
			String message = "setString发生异常。";
			LOGGER.warn(message, e);
			// e.printStackTrace();
		}
	}
}
